"""
# -*- coding: utf-8 -*-
# @Time    : 2023/5/29 8:53
# @Author  : 王摇摆
# @FileName: FFT.py
# @Software: PyCharm
# @Blog    ：https://blog.csdn.net/weixin_44943389?type=blog
"""
import numpy as np
from scipy.fftpack import fft, ifft
import matplotlib.pyplot as plt
from matplotlib.pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 采样点选择1400个
x = np.linspace(0, 1, 1400)

# 设置须要采样的信号，频率份量有200，400和600
y = 7 * np.sin(2 * np.pi * 200 * x) + 5 * np.sin(2 * np.pi * 400 * x) + 3 * np.sin(2 * np.pi * 600 * x)

fft_y = fft(y)  # 快速傅里叶变换

N = 1400
x = np.arange(N)  # 频率个数
half_x = x[range(int(N / 2))]  # 取一半区间

abs_y = np.abs(fft_y)
angle_y = np.angle(fft_y)
normalization_y = abs_y / N
normalization_half_y = normalization_y[range(int(N / 2))]

# 绘制原始波形
plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.title('原始波形')
plt.xlabel('采样点')
plt.ylabel('振幅')
plt.grid(True)
plt.show()

# 绘制双边振幅谱(未求振幅绝对值)
plt.figure(figsize=(8, 6))
plt.plot(x, fft_y, 'black')
plt.title('双边振幅谱(未求振幅绝对值)')
plt.xlabel('频率')
plt.ylabel('振幅')
plt.grid(True)
plt.show()

# 绘制双边振幅谱(未归一化)
plt.figure(figsize=(8, 6))
plt.plot(x, abs_y, 'r')
plt.title('双边振幅谱(未归一化)')
plt.xlabel('频率')
plt.ylabel('振幅')
plt.grid(True)
plt.show()

# 绘制双边相位谱(未归一化)
plt.figure(figsize=(8, 6))
plt.plot(x, angle_y, 'violet')
plt.title('双边相位谱(未归一化)')
plt.xlabel('频率')
plt.ylabel('相位')
plt.grid(True)
plt.show()

# 绘制单边振幅谱(归一化)
plt.figure(figsize=(8, 6))
plt.plot(half_x, normalization_half_y, 'blue')
plt.title('单边振幅谱(归一化)')
plt.xlabel('频率')
plt.ylabel('振幅')
plt.grid(True)
plt.show()

plt.show()